const targetMap = new WeakMap()
let activeEffect = null  // 副作用函数

export function effect(fn, options = {}) {  // effect是副作用函数
  const effectFn = () => {
    try {
      activeEffect = fn   // 将回调存到 activeEffect
      return fn()
    } catch (error) {
      activeEffect = null
    }
  }
  effectFn()
}

// 依赖收集
export function track(target, type, key) {
  // targetMap = {
  //   state: {
  //     key: [effect1, effect2, ...]
  //   }
  // }
  let depsMap = targetMap.get(target)      // 先看下该对象是否已经收集过
  if (!depsMap) {         // 如果没有收集过
    targetMap.set(target, (depsMap = new Map()))
  }
  let deps = depsMap.get(key)     // 对象上的属性是否收集过
  if (!deps) {
    deps = new Set()     // 也相当于 [effect1, effect2, ...]
  }
  if (!deps.has(activeEffect) && activeEffect) {      // activeEffect 就是computed里面的回调函数
    deps.add(activeEffect)
  }
  depsMap.set(key, deps)    // 往map里面添加
}

// 触发依赖
export function trigger(target, type, key) {
  const depsMap = targetMap.get(target)
  if (!depsMap) return

  const deps = depsMap.get(key)
  if (!deps) return

  deps.forEach(effect => {
    effect()
  })
}
